<?php

/**
 * Nette Framework - Debugger bluescreen template.
 *
 * @copyright  Copyright (c) 2004, 2010 David Grudl
 * @license    http://nettephp.com/license  Nette license
 * @link       http://nettephp.com
 * @category   Nette
 * @package    Nette
 *
 * @param      array     $exception
 * @param      array     $colophons
 * @param      array     $internals
 * @param      Nette\Application\Application $application
 * @return     void
 */

/*namespace Nette;*/



if (!function_exists(/*Nette\*/'_netteDebugPrintCode')) {

/**
 * Prints source code.
 * @param  string
 * @param  int
 * @param  int
 * @return void
 */
function _netteDebugPrintCode($file, $line, $count = 15)
{
	if (function_exists('ini_set')) {
		ini_set('highlight.comment', '#999; font-style: italic');
		ini_set('highlight.default', '#000');
		ini_set('highlight.html', '#06b');
		ini_set('highlight.keyword', '#d24; font-weight: bold');
		ini_set('highlight.string', '#080');
	}

	$start = max(1, $line - floor($count / 2));

	$source = @file_get_contents($file);
	if (!$source) return;
	$source = explode("\n", highlight_string($source, TRUE));
	$spans = 1;
	echo $source[0]; // <code><span color=highlight.html>
	$source = explode('<br />', $source[1]);
	array_unshift($source, NULL);

	$i = $start; // find last highlighted block
	while (--$i >= 1) {
		if (preg_match('#.*(</?span[^>]*>)#', $source[$i], $m)) {
			if ($m[1] !== '</span>') { $spans++; echo $m[1]; }
			break;
		}
	}

	$source = array_slice($source, $start, $count, TRUE);
	end($source);
	$numWidth = strlen((string) key($source));

	foreach ($source as $n => $s) {
		$spans += substr_count($s, '<span') - substr_count($s, '</span');
		$s = str_replace(array("\r", "\n"), array('', ''), $s);
		if ($n === $line) {
			printf(
				"<span class='highlight'>Line %{$numWidth}s:    %s\n</span>%s",
				$n,
				strip_tags($s),
				preg_replace('#[^>]*(<[^>]+>)[^<]*#', '$1', $s)
			);
		} else {
			printf("<span class='line'>Line %{$numWidth}s:</span>    %s\n", $n, $s);
		}
	}
	echo str_repeat('</span>', $spans), '</code>';
}



/**
 * Dumps variable.
 * @param  string
 * @return string
 */
function _netteDump($dump)
{
	return '<pre class="dump">' . preg_replace_callback('#(^|\s+)?(.*)\((\d+)\) <code>#', /*Nette\*/'_netteDumpCb', $dump) . '</pre>';
}

function _netteDumpCb($m)
{
	return "$m[1]<a href='#' onclick='return !netteToggle(this)'>$m[2]($m[3]) " . (trim($m[1]) || $m[3] < 7 ? '<abbr>&#x25bc;</abbr> </a><code>' : '<abbr>&#x25ba;</abbr> </a><code class="collapsed">');
}



/**
 * Opens panel.
 * @param  string
 * @param  bool
 * @return void
 */
function _netteOpenPanel($name, $collapsed)
{
	static $id;
	$id++;
	?>
	<div class="panel">
		<h2><a href="#" onclick="return !netteToggle(this, 'pnl<?php echo $id ?>')"><?php echo htmlSpecialChars($name) ?> <abbr><?php echo $collapsed ? '&#x25ba;' : '&#x25bc;' ?></abbr></a></h2>

		<div id="pnl<?php echo $id ?>" class="<?php echo $collapsed ? 'collapsed ' : '' ?>inner">
	<?php
}



/**
 * Closes panel.
 * @return void
 */
function _netteClosePanel()
{
	?>
		</div>
	</div>
	<?php
}

}


/**
 * Page title.
 */
static $errorTypes = array(
	E_ERROR => 'Fatal Error',
	E_USER_ERROR => 'User Error',
	E_RECOVERABLE_ERROR => 'Recoverable Error',
	E_CORE_ERROR => 'Core Error',
	E_COMPILE_ERROR => 'Compile Error',
	E_PARSE => 'Parse Error',
	E_WARNING => 'Warning',
	E_CORE_WARNING => 'Core Warning',
	E_COMPILE_WARNING => 'Compile Warning',
	E_USER_WARNING => 'User Warning',
	E_NOTICE => 'Notice',
	E_USER_NOTICE => 'User Notice',
	E_STRICT => 'Strict',
	E_DEPRECATED => 'Deprecated',
	E_USER_DEPRECATED => 'User Deprecated',
);
$title = ($exception instanceof /*\*/FatalErrorException && isset($errorTypes[$exception->getSeverity()])) ? $errorTypes[$exception->getSeverity()] : get_class($exception);
$rn = 0;

if (headers_sent()) {
	echo '</pre></xmp></table>';
}

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<meta name="robots" content="noindex,noarchive">
	<meta name="generator" content="Nette Framework">

	<title><?php echo htmlspecialchars($title) ?></title><!-- <?php echo $exception->getMessage(), ($exception->getCode() ? ' #' . $exception->getCode() : '') ?> -->

	<style type="text/css">
	/* <![CDATA[ */
		body {
			margin: 0 0 2em;
			padding: 0;
		}

		#netteBluescreen {
			font: 9pt/1.5 Verdana, sans-serif;
			background: white;
			color: #333;
			position: absolute;
			left: 0;
			top: 0;
			width: 100%;
			z-index: 23178;
			text-align: left;
		}

		#netteBluescreen * {
			color: inherit;
			background: inherit;
			text-align: inherit;
		}

		#netteBluescreenIcon {
			position: absolute;
			right: .5em;
			top: .5em;
			z-index: 23179;
			text-decoration: none;
			background: red;
			padding: 3px;
		}

		#netteBluescreenIcon abbr {
			color: black !important;
		}

		#netteBluescreen h1 {
			font: 18pt/1.5 Verdana, sans-serif !important;
			margin: .6em 0;
		}

		#netteBluescreen h2 {
			font: 14pt/1.5 sans-serif !important;
			color: #888;
			margin: .6em 0;
		}

		#netteBluescreen a {
			text-decoration: none;
			color: #4197E3;
		}

		#netteBluescreen a abbr {
			font-family: sans-serif;
			color: #999;
		}

		#netteBluescreen h3 {
			font: bold 10pt/1.5 Verdana, sans-serif !important;
			margin: 1em 0;
			padding: 0;
		}

		#netteBluescreen p {
			margin: .8em 0
		}

		#netteBluescreen pre, #netteBluescreen code, #netteBluescreen table {
			font: 9pt/1.5 Consolas, monospace !important;
		}

		#netteBluescreen pre, #netteBluescreen table {
			background: #fffbcc;
			padding: .4em .7em;
			border: 1px dotted silver;
		}

		#netteBluescreen table pre {
			padding: 0;
			margin: 0;
			border: none;
		}

		#netteBluescreen pre.dump span {
			color: #c16549;
		}

		#netteBluescreen pre.dump a {
			color: #333;
		}

		#netteBluescreen div.panel {
			border-bottom: 1px solid #eee;
			padding: 1px 2em;
		}

		#netteBluescreen div.inner {
			padding: 0.1em 1em 1em;
			background: #f5f5f5;
		}

		#netteBluescreen table {
			border-collapse: collapse;
			width: 100%;
		}

		#netteBluescreen td, #netteBluescreen th {
			vertical-align: top;
			text-align: left;
			padding: 2px 3px;
			border: 1px solid #eeeebb;
		}

		#netteBluescreen th {
			width: 10%;
			font-weight: bold;
		}

		#netteBluescreen .odd, #netteBluescreen .odd pre {
			background-color: #faf5c3;
		}

		#netteBluescreen ul {
			font: 7pt/1.5 Verdana, sans-serif !important;
			padding: 1em 2em 50px;
		}

		#netteBluescreen .highlight, #netteBluescreenError {
			background: red;
			color: white;
			font-weight: bold;
			font-style: normal;
			display: block;
		}

		#netteBluescreen .line {
			color: #9e9e7e;
			font-weight: normal;
			font-style: normal;
		}

	/* ]]> */
	</style>


	<script type="text/javascript">
	/* <![CDATA[ */
		document.write('<style> .collapsed { display: none; } <\/style>');

		function netteToggle(link, panelId)
		{
			var arrow = link.getElementsByTagName('abbr')[0];
			var panel = panelId ? document.getElementById(panelId) : link.nextSibling;
			while (panel.nodeType !== 1) panel = panel.nextSibling;
			var collapsed = panel.currentStyle ? panel.currentStyle.display == 'none' : getComputedStyle(panel, null).display == 'none';

			arrow.innerHTML = String.fromCharCode(collapsed ? 0x25bc : 0x25ba);
			panel.style.display = collapsed ? (panel.tagName.toLowerCase() === 'code' ? 'inline' : 'block') : 'none';

			return true;
		}
	/* ]]> */
	</script>
</head>



<body>
<div id="netteBluescreen">
	<a id="netteBluescreenIcon" href="#" onclick="return !netteToggle(this)"><abbr>&#x25bc;</abbr></a

	><div>
		<div id="netteBluescreenError" class="panel">
			<h1><?php echo htmlspecialchars($title), ($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1>

			<p><?php echo htmlspecialchars($exception->getMessage()) ?></p>
		</div>



		<?php $ex = $exception; $level = 0; ?>
		<?php do { ?>

			<?php if ($level++): ?>
				<?php _netteOpenPanel('Caused by', $level > 2) ?>
				<div class="panel">
					<h1><?php echo htmlspecialchars(get_class($ex)), ($ex->getCode() ? ' #' . $ex->getCode() : '') ?></h1>

					<p><?php echo htmlspecialchars($ex->getMessage()) ?></p>
				</div>
			<?php endif ?>

			<?php $collapsed = isset($internals[$ex->getFile()]); ?>
			<?php if (is_file($ex->getFile())): ?>
			<?php _netteOpenPanel('Source file', $collapsed) ?>
				<p><strong>File:</strong> <?php echo htmlspecialchars($ex->getFile()) ?> &nbsp; <strong>Line:</strong> <?php echo $ex->getLine() ?></p>
				<pre><?php _netteDebugPrintCode($ex->getFile(), $ex->getLine()) ?></pre>
			<?php _netteClosePanel() ?>
			<?php endif?>



			<?php _netteOpenPanel('Call stack', FALSE) ?>
				<ol>
					<?php foreach ($ex->getTrace() as $key => $row): ?>
					<li><p>

					<?php if (isset($row['file'])): ?>
						<span title="<?php echo htmlSpecialChars($row['file'])?>"><?php echo htmlSpecialChars(basename(dirname($row['file']))), '/<b>', htmlSpecialChars(basename($row['file'])), '</b></span> (', $row['line'], ')' ?>
					<?php else: ?>
						&lt;PHP inner-code&gt;
					<?php endif ?>

					<?php if (isset($row['file']) && is_file($row['file'])): ?><a href="#" onclick="return !netteToggle(this, 'src<?php echo "$level-$key" ?>')">source <abbr>&#x25ba;</abbr></a>&nbsp; <?php endif ?>

					<?php if (isset($row['class'])) echo $row['class'] . $row['type'] ?>
					<?php echo $row['function'] ?>

					(<?php if (!empty($row['args'])): ?><a href="#" onclick="return !netteToggle(this, 'args<?php echo "$level-$key" ?>')">arguments <abbr>&#x25ba;</abbr></a><?php endif ?>)
					</p>

					<?php if (!empty($row['args'])): ?>
						<div class="collapsed" id="args<?php echo "$level-$key" ?>">
						<table>
						<?php
						try {
							$r = isset($row['class']) ? new /*\*/ReflectionMethod($row['class'], $row['function']) : new /*\*/ReflectionFunction($row['function']);
							$params = $r->getParameters();
						} catch (/*\*/Exception $e) {
							$params = array();
						}
						foreach ($row['args'] as $k => $v) {
							echo '<tr><th>', (isset($params[$k]) ? '$' . $params[$k]->name : "#$k"), '</th><td>';
							echo _netteDump(self::_dump($v, 0));
							echo "</td></tr>\n";
						}
						?>
						</table>
						</div>
					<?php endif ?>


					<?php if (isset($row['file']) && is_file($row['file'])): ?>
						<pre <?php if (!$collapsed || isset($internals[$row['file']])) echo 'class="collapsed"'; else $collapsed = FALSE ?> id="src<?php echo "$level-$key" ?>"><?php _netteDebugPrintCode($row['file'], $row['line']) ?></pre>
					<?php endif ?>

					</li>
					<?php endforeach ?>

					<?php if (!isset($row)):?>
					<li><i>empty</i></li>
					<?php endif ?>
				</ol>
			<?php _netteClosePanel() ?>



			<?php if ($ex instanceof IDebuggable): ?>
			<?php foreach ($ex->getPanels() as $name => $panel): ?>
			<?php _netteOpenPanel($name, empty($panel['expanded'])) ?>
				<?php echo $panel['content'] ?>
			<?php _netteClosePanel() ?>
			<?php endforeach ?>
			<?php endif ?>



			<?php if (isset($ex->context) && is_array($ex->context)):?>
			<?php _netteOpenPanel('Variables', TRUE) ?>
			<table>
			<?php
			foreach ($ex->context as $k => $v) {
				echo '<tr><th>$', htmlspecialchars($k), '</th><td>', _netteDump(self::_dump($v, 0)), "</td></tr>\n";
			}
			?>
			</table>
			<?php _netteClosePanel() ?>
			<?php endif ?>

		<?php } while ((method_exists($ex, 'getPrevious') && $ex = $ex->getPrevious()) || (isset($ex->previous) && $ex = $ex->previous)); ?>
		<?php while (--$level) _netteClosePanel() ?>



		<?php if (!empty($application)):?>
		<?php _netteOpenPanel('Nette Application', TRUE) ?>
			<h3>Requests</h3>
			<?php $tmp = $application->getRequests(); echo _netteDump(self::_dump($tmp, 0)) ?>

			<h3>Presenter</h3>
			<?php $tmp = $application->getPresenter(); echo _netteDump(self::_dump($tmp, 0)) ?>
		<?php _netteClosePanel() ?>
		<?php endif ?>



		<?php _netteOpenPanel('Environment', TRUE) ?>
			<?php
			$list = get_defined_constants(TRUE);
			if (!empty($list['user'])):?>
			<h3><a href="#" onclick="return !netteToggle(this, 'pnl-env-const')">Constants <abbr>&#x25bc;</abbr></a></h3>
			<table id="pnl-env-const">
			<?php
			foreach ($list['user'] as $k => $v) {
				echo '<tr'.($rn++%2?' class="odd"':'').'><th>', htmlspecialchars($k), '</th>';
				echo '<td>', _netteDump(self::_dump($v, 0)), "</td></tr>\n";
			}
			?>
			</table>
			<?php endif ?>


			<h3><a href="#" onclick="return !netteToggle(this, 'pnl-env-files')">Included files <abbr>&#x25ba;</abbr></a>(<?php echo count(get_included_files()) ?>)</h3>
			<table id="pnl-env-files" class="collapsed">
			<?php
			foreach (get_included_files() as $v) {
				echo '<tr'.($rn++%2?' class="odd"':'').'><td>', htmlspecialchars($v), "</td></tr>\n";
			}
			?>
			</table>


			<h3>$_SERVER</h3>
			<?php if (empty($_SERVER)):?>
			<p><i>empty</i></p>
			<?php else: ?>
			<table>
			<?php
			foreach ($_SERVER as $k => $v) echo '<tr'.($rn++%2?' class="odd"':'').'><th>', htmlspecialchars($k), '</th><td>', _netteDump(self::_dump($v, 0)), "</td></tr>\n";
			?>
			</table>
			<?php endif ?>
		<?php _netteClosePanel() ?>



		<?php _netteOpenPanel('HTTP request', TRUE) ?>
			<?php if (function_exists('apache_request_headers')): ?>
			<h3>Headers</h3>
			<table>
			<?php
			foreach (apache_request_headers() as $k => $v) echo '<tr'.($rn++%2?' class="odd"':'').'><th>', htmlspecialchars($k), '</th><td>', htmlspecialchars($v), "</td></tr>\n";
			?>
			</table>
			<?php endif ?>


			<?php foreach (array('_GET', '_POST', '_COOKIE') as $name): ?>
			<h3>$<?php echo $name ?></h3>
			<?php if (empty($GLOBALS[$name])):?>
			<p><i>empty</i></p>
			<?php else: ?>
			<table>
			<?php
			foreach ($GLOBALS[$name] as $k => $v) echo '<tr'.($rn++%2?' class="odd"':'').'><th>', htmlspecialchars($k), '</th><td>', _netteDump(self::_dump($v, 0)), "</td></tr>\n";
			?>
			</table>
			<?php endif ?>
			<?php endforeach ?>
		<?php _netteClosePanel() ?>



		<?php _netteOpenPanel('HTTP response', TRUE) ?>
			<h3>Headers</h3>
			<?php if (headers_list()): ?>
			<pre><?php
			foreach (headers_list() as $s) echo htmlspecialchars($s), '<br>';
			?></pre>
			<?php else: ?>
			<p><i>no headers</i></p>
			<?php endif ?>
		<?php _netteClosePanel() ?>


		<ul>
			<?php foreach ($colophons as $callback): ?>
			<?php foreach ((array) call_user_func($callback, 'bluescreen') as $line): ?><li><?php echo $line, "\n" ?></li><?php endforeach ?>
			<?php endforeach ?>
		</ul>
	</div>
</div>

<script type="text/javascript">
	document.body.appendChild(document.getElementById('netteBluescreen'));
</script>
</body>
</html>